#ifndef INSTANTIATOR_H
#define INSTANTIATOR_H

#include <QObject>
#include <QMap>

#include "baseelement.h"
#include "circuitelement.h"
#include "realelement.h"
#include "inelement.h"
#include "clock.h"

#include "factoryinterface.h"
#include "objectsloader.h"

//Фабрика классов для создания элементов
template<typename F> struct ClassFactory : public FactoryInterface {
    QObject* create() const { return new F; }
};

//Создатель классов [Custom Element]
class Instantiator
{
private:
    Instantiator();
    Instantiator(const Instantiator& instantiator);

    ~Instantiator();
    // Зарегистрированные классы объектов
    QMap<QString, FactoryInterface*> mMap;
    // Экземпляр класса
    static Instantiator instance;

public:
    //Создать объект по имени типа
    QObject* create( const QString& className );

    //Создать элемент по имени типа
    BaseElement* createElement(const QString& className);

    //Создать элемент по псевдониму и проинициализировать конфигурацию
    BaseElement* buildElement(const QString& alias);

    //Регистрация типа для [Custom Element]
    template<typename T> void registerClass();

    //Получить экземпляр конструктора объектов
    static Instantiator& getInstance();
};

#endif // INSTANTIATOR_H
